package es.gesfutbol.dao;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.PartitDeQuiniela;
import es.gesfutbol.domini.implementacio.Quiniela;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class QuinielaDao extends HibernateDao<Quiniela, Long> implements IQuinielaDao{

	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Quiniela deproxy(Quiniela quiniela) {
			Set<PartitDeQuiniela> partitsDeQuiniela = quiniela.getPartits();
		 	this.getSessionFactory().getCurrentSession().lock(quiniela, LockMode.NONE);
		 	Hibernate.initialize(partitsDeQuiniela);
	        Iterator<PartitDeQuiniela> itPartitDeQuiniela = partitsDeQuiniela.iterator();
	        Set<PartitDeQuiniela> partits2 = new HashSet<PartitDeQuiniela>();
	        while (itPartitDeQuiniela.hasNext()) {
	        	PartitDeQuiniela partitDeQuiniela = itPartitDeQuiniela.next();
	            Hibernate.initialize(partitDeQuiniela);
	            partitDeQuiniela = HibernateHelper.deproxy(partitDeQuiniela, PartitDeQuiniela.class);
	            partits2.add(partitDeQuiniela);
	        }
	        quiniela.setPartits(partits2);	        
	        return quiniela;
	}
	
//	@SuppressWarnings("deprecation")
//	@Transactional(readOnly = true)
//	public Lliga deproxy(Lliga lliga){		
//		 	Set<Jornada> jornades = lliga.getJornades();
//		 	this.getSessionFactory().getCurrentSession().lock(lliga, LockMode.NONE);
//		 	Hibernate.initialize(jornades);
//	        Iterator<Jornada> itJornada = jornades.iterator();
//	        Set<Jornada> jornades2 = new HashSet<Jornada>();
//	        while (itJornada.hasNext()) {
//	            Jornada jornada = itJornada.next();
//	            Hibernate.initialize(jornada);
//	            jornada = HibernateHelper.deproxy(jornada, Jornada.class);
//	            jornades2.add(jornada);
//	        }
//	        lliga.setJornades(jornades2);	        
//	        return lliga;
//	}
	
	@Transactional(readOnly=false)
	public void save(Quiniela quiniela) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(quiniela);		
	}
	
	@Transactional(readOnly = true)
	public Quiniela findQuinielaActiva(){
		Quiniela quiniela = (Quiniela) this.getSessionFactory().getCurrentSession()
		.createCriteria(Quiniela.class)
		.add( Restrictions.eq("estaActiu", true) )
		.uniqueResult();
		
		return quiniela;
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	@Override
	public List<Quiniela> findByTemporada(String temporada) {
		return this.getSessionFactory().getCurrentSession()
					.createCriteria(Quiniela.class)
					.add(Restrictions.eq("temporada", temporada)).list();
	}
	
	

}
